/*
 * TermOccurrenceSequentialFile.h
 *
 *  Created on: Nov 27, 2012
 *      Author: m
 */

#ifndef TERMOCCURRENCESEQUENTIALFILE_H_
#define TERMOCCURRENCESEQUENTIALFILE_H_

#include "../common_components/FixedSizeBlockSequentialFile.h"
#include "../serializers/FixedSizeRecordSerializer.h"
#include "TermOccurrence.h"

#define TERM_OCURRENCE_SIZE sizeof(TermOccurrence)

namespace physical
{

/**
 * Archivo secuencial de Ocurrencia de Términos
 */
class TermOccurrenceSequentialFile
{
public:

    /**
     * Constructor por defecto
     */
    TermOccurrenceSequentialFile();

    /**
     * Constructor por valor
     *
     * Crea un TermOccurrenceSequentialFile
     *  y le asocia un archvo, abierto en
     *  el modo indicado. Si no se indica
     *  ningún modo se abre en el modo
     *  por defecto ( in | out | app )
     *
     * @param filename Nombre del archivo a asociar
     * @param mode Modo de apertura. Valor por
     *              defecto: ( in | out | app )
     */
    TermOccurrenceSequentialFile( const char* filename,
            openmode mode = s_defaultOpenmode );

    /**
     * Destructor
     */
    virtual ~TermOccurrenceSequentialFile();

    /**
     * Devuelve la TermOccurrence siguiente
     *
     * @return el término siguiente
     */
    TermOccurrence get();

    /**
     * Guarda un nuevo TermOccurrence al final del archivo
     *
     * @param term
     */
    void put( const TermOccurrence& term );

    /**
     * Verifica si existen más elementos para leer
     *
     * @return true si existen más elementos para
     *          leer, false en caso contrario
     */
    bool hasNext();

    /**
     * Asocia un archivo al TermOccurrenceSequentialFile
     *
     * @param filename Nombre del archivo
     * @param mode Modo de apertura
     */
    void open( const char* filename, openmode mode = s_defaultOpenmode );

    /**
     * Desasocia un archivo del TermSequentialFile
     */
    void close();

protected:
    static const openmode s_defaultOpenmode =
            std::ios_base::in | std::ios_base::out | std::ios_base::app;

    std::unique_ptr< FixedSizeBlockSequentialFile< TERM_OCURRENCE_SIZE > > m_file;
    std::unique_ptr< FixedSizeRecordSerializer< TermOccurrence > > m_serializer;
};

} /* namespace physical */
#endif /* TERMOCCURRENCESEQUENTIALFILE_H_ */
